package controllers

import (
	"fmt"
	"smallgift/models"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	"github.com/dgrijalva/jwt-go"
	"strings"
	"time"
)

type UserController struct {
	Router
}

// @router /login [post]
func (this *UserController) Login() {
	this.Opkey = OPKEY_LOGIN

	usr := models.UserInfo{}
	//校验用户名格式
	usr.UserName = this.GetStr("user_name", "")
	if len(usr.UserName) == 0 {
		this.Data["json"] = this.GenErrResp("用户名不能为空")
		this.ServeJSON()
		return
	}
	//校验密码格式
	pwd := this.GetStr("password", "")
	if len(pwd) == 0 {
		this.Data["json"] = this.GenErrResp("登录密码不能为空")
		this.ServeJSON()
		return
	}
	pwd = this.MD5(pwd)
	if err := usr.Read("user_name"); err != nil && err != orm.ErrNoRows {
		this.Data["json"] = this.GenErrResp("登录失败:系统繁忙!")
		this.ServeJSON()
		return
	} else if err == orm.ErrNoRows {
		this.Data["json"] = this.GenErrResp("登录失败:用户名或密码错误!")
		this.ServeJSON()
		return
	} else {
		if usr.ErrIdx >= models.ERR_LOGIN_MAX_NUM {
			//密码错误超过 5 次了.不允许登录了..
			//查看当前时间跟错误时间比对.
			curr := time.Now().Format("2006-01-02 15:04:05")
			prev := usr.ErrTime
			currT, _ := time.Parse("2006-01-02 15:04:05", curr)
			prevT, _ := time.Parse("2006-01-02 15:04:05", prev)
			loginT := prevT.Add(time.Duration(30) * time.Minute)
			if loginT.After(currT) {
				deltaT := loginT.Sub(currT).String()
				this.Data["json"] = this.GenErrResp(fmt.Sprintf("密码连续输错[%d]次,账户已被禁用,请于%s后重试", usr.ErrIdx, deltaT))
				this.ServeJSON()
				return
			} else {
				//归位
				usr.ErrIdx = 0
				usr.ErrTime = ""
				usr.Update()
			}
		}

		if strings.ToUpper(usr.Password) != pwd {
			//这种属于密码错误的.
			//密码错误的.需要增加计数器
			usr.AddErrIdx()
			this.Data["json"] = this.GenErrResp(fmt.Sprintf("密码校验失败,您还可以重试[%d]次", models.ERR_LOGIN_MAX_NUM-usr.ErrIdx))
			this.ServeJSON()
			return
		} else {
			//归位
			usr.ErrIdx = 0
			usr.ErrTime = ""
			usr.Update()
		}


	}

	//BALABALALA TODO
	if v, err := models.ReadUserInfoByUUID(usr.Uuid); err != nil && err != orm.ErrNoRows {
		beego.Debug(err.Error())
		this.Data["json"] = this.GenErrResp(err.Error())
		this.ServeJSON()
		return
	} else {
		usr = v
	}

	//这里修改为商户系统可以同时登录..那此时 TOKEN 就不能每次登录都生成了.
	//超时之后统一生成.

	//生成 TOKEN
	// if len(usr.CurrentToken) == 0 || !this.checkTokenValid(usr.CurrentToken) {
	token := ""
	jwt_token := jwt.New(jwt.SigningMethodHS256)
	claims := make(jwt.MapClaims)
	claims["exp"] = time.Now().Add(time.Hour * time.Duration(6)).Unix() //6小时有效期
	claims["iat"] = time.Now().Unix()
	claims["sub"] = usr.Uuid
	jwt_token.Claims = claims
	if v, err := jwt_token.SignedString(this.GetSecretKey()); err != nil {
		beego.Error(err.Error())
		this.Data["json"] = this.GenErrResp("TOKEN错误")
		this.ServeJSON()
		return
	} else {
		token = v
		beego.Error(token)
	}
	usr.CurrentToken = token
	if err := usr.Update(); err != nil {
		this.Data["json"] = this.GenErrResp("系统繁忙,请重试!")
		this.ServeJSON()
		return
	}
	// }
	this.MchUser = usr

	//登录成功后.仅仅返回 TOKEN....其它用户基本信息.权限.等其它信息..都在前端登录后.业务上调用.

	resp_data := BaseReturnBean{}
	resp_data.Code = "0"
	resp_data.Msg = "SUCCESS"
	resp_data.Data = token
	this.Data["json"] = resp_data
	this.ServeJSON()
	return

}